



#include <iostream>
#include <vector>
#include <boost/spirit.hpp>
using namespace std;
using namespace boost::spirit;
int main()
{
    // pushreal函数对象，把数字放入vector中
    struct pushreal
    {
        void operator()(double v) const
        {
            m_vec.push_back(v);
        }
        pushreal(vector<double> &vec)
                :m_vec(vec){;}
    private:
        vector<double> &m_vec;
    };


    {
        // 构造和操作符演示
        std::vector<double> mm;
        mm.push_back(88);
        mm.push_back(77);
        pushreal pp(mm);
        pp(99);
        copy(mm.begin(),mm.end(),ostream_iterator<double>(cout," in mm.")); std::cout<<std::endl;
    }

    {
        vector<double> reallist;
        //用于解析的字符串
        const char *szNumberList = "12.4,1000,-1928,33,30";
        //这次用pushreal对象作为Actor
        parse_info<> r = parse( szNumberList, real_p[pushreal(reallist)] % ',' );
        cout << "parsed " << (r.full?"successful":"failed") << endl;
        cout << szNumberList << endl;
        //使用parse_info::stop确定最后解析的位置便于查错
        cout << string(r.stop - szNumberList, ' ') << '^' << endl;
        //显示结果
        copy(reallist.begin(),reallist.end(),ostream_iterator<double>(cout," in vec . "));

    }

    {
        // 放入vector 简单的用法
        vector<double> reallist;
        //用于解析的字符串
        const char *szNumberList = "12.4,1000,-1928,33,30";
        //使用自带的push_back_a
        parse_info<> r = parse( szNumberList, real_p[push_back_a(reallist)] % ',' );
        cout << "parsed " << (r.full?"successful":"failed") << endl;
        cout << szNumberList << endl;
        //使用parse_info::stop确定最后解析的位置便于查错
        cout << string(r.stop - szNumberList, ' ') << '^' << endl;
        //显示结果
        copy(reallist.begin(),reallist.end(),ostream_iterator<double>(cout," in simple "));
    }


    /****************************************************************************************************************
     *
     *     在上面的实数序列中，如果中间含有空格或TAB，这个解析就不能成功，这时可以使用parse函数的另一个重载版本：

            parse_info<charT const*> parse(字符串, 解析器1, 解析器2);
            //或
            parse_info parse(IteratorT first, IteratorT last, 解析器1, 解析器2);

            其中的解析器2用于跳过其匹配的字符，我们要跳过空格，所以解析器2可以使用space_p：

            parse_info<> r = parse( szNumberList,
                real_p[push_back_a(reallist)] % ',',
                space_p);

            如果更进一步，我们甚至可以连逗号也跳过，直接取得一列数字：

            parse_info<> r = parse( szNumberList,
                *real_p[push_back_a(reallist)],
                space_p|ch_p(','));

     *
     *****************************************************************************************************************/

    return 0;

}



